package com.heima.interceptor;


import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import com.heima.thread.UserThreadLocal;
import org.apache.commons.lang3.StringUtils;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 定义一个拦截器，实现 HandlerInterceptor
 */
public class TokenInfoInterceptor implements HandlerInterceptor {
    // 前置拦截
    // 主要做的事：获取从gateway传递过来的用户信息
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1. 获取请求头上的用户信息
        // TODO 这一步要根据网关那边的代码，进行对应的调整，具体看网关过滤器的 76 行
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            return false;
        }
        // 校验token是否有效，有效是true，无效是false
        // 参数一：要校验的token
        // 参数二：秘钥（注意，这个秘钥要和生成token时那个秘钥保持一致）
        boolean verify = JWTUtil.verify(token, "heima".getBytes());
        if (!verify) {
            System.out.println("token校验失败");
            return false;
        }

        // 提取token中的载荷信息
        // base64码 -> JSON形式的用户信息 -> JWT对象上（Map结构）
        // { "id": 101, "openId": "axasxasas" }
        JWT jwt = JWTUtil.parseToken(token);
        // 提取载荷中，某个字段的内容
        // 载荷，是用户信息的JSON字符串，通过base64编码得来的
        String Id = (String) jwt.getPayload("id");

        // 2. 将id参数放到ThreadLocal里面
        //就是提取token中的用户id写入到ThreadLocal
        // TODO id字段要根据上面的代码做调整
        UserThreadLocal.set(Id);

        return true;
    }

    // 完成时拦截
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        // 固定操作，删除不需要的ThreadLocal数据
        UserThreadLocal.remove();
    }
}
